package com.linwen.javase;

import java.util.Objects;

/**
 * @author : linwen
 * @date : 上午12:29 2020/12/30
 * ==用来判断基本数据类型是否相等
 * equals用于判断引用数据类型是否相等，一般地自定义数据类型判断是否相等是判断其中属性是否相等，而非地址值相等。
 * object类中的equals是==，即判断是否同一对象。
 * 常用类中String Date中的equals已经重写过，因此String比较时用equals，不能用==
 * 重写equals的原则：
 *              1：对称性   a.equals(b)  ==>  b.equals(a)
 *              2:自反性   a.equals(a) ==>true
 *              3:传递性   a.equals(b) b.equals(c)  ==>a.equals(c)
 *              4:一致性   a.equals(b)为true，则无论执行多少次，结果仍然是true
 *              任何情况下a.equals(null)结果永远为false
 *
 */
public class _equals {
    public static void main(String[] args) {
        Person p1 = new Person("zhangsan",18);
        Person p2 = new Person("zhangsan",18);
        System.out.println(p1.equals(p2));
        String st1 = new String("hello");
        String st2 = new String("hello");
        System.out.println(st1==st2);
    }
}
class Person{
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //一般情况下不用手写equlas，可以用ide自动生成
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                name.equals(person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
